﻿//==============================================================================
// File: IDynamicPropertyRegistry.cs
// Created: 2010-05-10
// Author: Piotr Włodek
//==============================================================================
// This file is a part of MAMMOTH project.
// Copyright (C) 2010 AGH University of Science and Technology, Krakow.
// https://caribou.iisg.agh.edu.pl/trac/mammoth
//
// Mammoth is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// 
// Mammoth is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Lesser General Public License for more details.
// 
// You should have received a copy of the GNU Lesser General Public License
// along with WpfRcp. If not, see http://www.gnu.org/licenses/.
//==============================================================================

using System;

namespace WpfRcp.PropertyModel.Core
{
    /// <summary>
    /// Interface defining a property registry that can manage dynamic properties.
    /// </summary>
    public interface IDynamicPropertyRegistry
    {
        /// <summary>
        /// Registers new dynamic property. Dynamic property is usually added per object instance.
        /// </summary>
        /// <param name="name">Property name. Must be unique in current context.</param>
        /// <param name="propertyType">CLR property type.</param>
        /// <returns>Newly created <see cref="MetaProperty"/>.</returns>
        MetaProperty RegisterDynamic(string name, Type propertyType);

        /// <summary>
        /// Registers new dynamic property. Dynamic property is usually added per object instance.
        /// </summary>
        /// <param name="name">Property name. Must be unique in current context.</param>
        /// <param name="propertyType">CLR property type.</param>
        /// <param name="metadata">Property metadata.</param>
        /// <returns>Newly created <see cref="MetaProperty"/>.</returns>
        MetaProperty RegisterDynamic(string name, Type propertyType, PropertyMetadata metadata);

        /// <summary>
        /// Unregisters dynamic property. 
        /// </summary>
        /// <param name="metaProperty">Property to be removed. If property hasn't been previously registered, exception is thrown.</param>
        void UnregisterDynamic(MetaProperty metaProperty);

        /// <summary>
        /// Unregisters dynamic property.
        /// </summary>
        /// <param name="name">Name of property to be removed. If property hasn't been previously registered, exception is thrown.</param>
        void UnregisterDynamic(string name);

        /// <summary>
        /// Method that returns all dynamic properties registered in the registry.
        /// </summary>
        /// <returns>Returns all dynamic properties registered in the registry.</returns>
        MetaPropertyCollection GetDynamicProperties();
    }
}
